package top.kuxiao.crmserver.utils;


import io.jsonwebtoken.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import top.kuxiao.crmserver.pojo.AccountManager;
import top.kuxiao.crmserver.pojo.IUser;
import top.kuxiao.crmserver.pojo.SalesExecutive;
import top.kuxiao.crmserver.pojo.SysUser;

import java.util.*;

/**
 * 1.创建token
 * 2.解析token
 * 3.判断token是否有效
 * jwt（json web token）的两种实现方式
 * jws（json web signature）: json web 签名
 * jwe（json web encryption）: json web 加密
 * <p>
 * 保存登录信息的加密和解密
 * </p>
 *
 * @author xiaozhang
 * @since 2022-01-13
 */
@Component
public class JWTUtil {

    //1.设置有效期
    private long exp = 24*60*60*60;
    //2.设置加密的密钥
    private String secret = "good.day";



    /**
     * 1.创建token（对象转String）
     * */
    public String createToken(Map<String, Object> map) {
        JwtBuilder jwtBuilder = Jwts.builder();

        //设置数据
        jwtBuilder.setClaims(map);
        //设置主题
        jwtBuilder.setSubject(String.valueOf(map.hashCode()));
        //设置发布日期
        jwtBuilder.setIssuedAt(new Date());
        //设置过期时间
        jwtBuilder.setExpiration(new Date(System.currentTimeMillis() + exp));


        //signWith(参数1，参数2)
        //参数1：加密算法
        //参数2：密钥
        jwtBuilder.signWith(SignatureAlgorithm.HS512, secret);

        return jwtBuilder.compact();
    }

    /**
     * 2. 解析token（string 转对象）
     * */
    public Claims parseToken(String token) {
        JwtParser jwtParser = Jwts.parser();
        //设置解析的时候使用的密钥（同加密的密钥）
        jwtParser.setSigningKey(secret);
        return jwtParser.parseClaimsJws(token).getBody();
    }

    /**
     * 3.判读token是否有效
     * */
    public boolean inValid(String token) {
        try {
            parseToken(token);
            return true;
        } catch (Exception e) {
            return false;
        }

    }

    public boolean buttonFlag(String token) {
        Claims claims = parseToken(token);
        Object obj = claims.get("flag");
        if (obj instanceof Boolean) {
            return (boolean) obj;
        }
        return false;
    }

    /**
     * 4.获取登录者的基本信息
     * */
    public SysUser getObject(String token) {
        Claims claims = parseToken(token);
        Object obj = claims.get("data");

        if (obj instanceof Map) {
            Map<String, Object> map = (Map<String, Object>) obj;

            SysUser sysUser = new SysUser();

            sysUser.setUserId((Integer) map.get("userId"));
            sysUser.setName((String) map.get("name"));
            sysUser.setPower((String)map.get("power"));
            sysUser.setState((String) map.get("state"));

            return sysUser;
        }
        return null;
    }

    /**
     * 获取登录者的身份
     * */
    public String getRole(String token) {
        Claims claims = parseToken(token);
        Object obj = claims.get("role");

        if (obj instanceof String) {
            return (String) obj;
        }
        return null;
    }

    public static void main(String[] args) {
//        JWTUtil jwtUtil = new JWTUtil();
//
//        System.out.println(jwtUtil.a1);
//
//        System.out.println(jwtUtil.a2);

//        Integer i = 10;
//        Long a = Long.valueOf(i);
//
//        System.out.println(a);

//        JWTUtil jwtUtil = new JWTUtil();
//
//        SalesExecutive salesExecutive = new SalesExecutive();
//        salesExecutive.setSeName("alice");
//        HashMap<String, Object> map = new HashMap<>();
//        map.put("role","SE");
//        map.put("data",salesExecutive);
//
//
//        String token=jwtUtil.createToken(map);
//
//
//        System.out.println("token"+token);
//
//
//        IUser object = jwtUtil.getObject(token);
//        System.out.println(object);
//
//        String role = jwtUtil.getRole(token);
//        System.out.println(role);


//
//        if (jwtUtil.inValid(token)){
//            System.out.println("可以转换");
//        }else {
//            System.out.println("Token失效");
//        }

    }

}
